﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
using Microsoft.Office.Interop.Word;
using Microsoft.Office.Core;

namespace TISS_Add_in
{
    public partial class uc_ListaProcedimentos : UserControl
    {
        Microsoft.Office.Core.CustomXMLPart customXMLPart;
        List<int> procedimentosMembrosIDs = new List<int>();
        List<ProcedimentoHandler> Procedimentos = new List<ProcedimentoHandler>();
        TipoGuia tipoGuia = new TipoGuia();
        
        public uc_ListaProcedimentos(Microsoft.Office.Core.CustomXMLPart customXMLPart, List<ProcedimentoHandler> procedimentos, TipoGuia tg)
        {
            InitializeComponent();
            this.customXMLPart = customXMLPart;
            this.Procedimentos = procedimentos;
            this.tipoGuia = tg;
            fillListView();
        }

        private void fillListView()
        {
            ListViewItem procedimentoItem;
            string[] procedimentoDados = new string[4];

            foreach (ProcedimentoHandler procedimento in this.Procedimentos)
            {
                procedimentoDados[0] = procedimento.Numero;
                procedimentoDados[1] = procedimento.Codigo;
                procedimentoDados[2] = procedimento.DataHora;
                procedimentoDados[3] = procedimento.TipoTabela;
                procedimentoItem = new ListViewItem(procedimentoDados);

                listViewProcedimentos.Items.Add(procedimentoItem);
            }
        }

        private void buttonOK_Click(object sender, EventArgs e)
        {   
            int procedimentoSelecionado = Convert.ToInt32(listViewProcedimentos.SelectedItems[0].SubItems[0].Text);
            string queryIndex = (procedimentoSelecionado + 1).ToString();
            DataOfAvailableRow infoOfAvailableRow = new DataOfAvailableRow();

            if (tipoGuia == TipoGuia.Resumo_Internação)
            {
                foreach (Microsoft.Office.Interop.Word.Row row in Globals.ThisAddIn.Application.ActiveDocument.Tables[1].Rows)
                {
                    if (row.Cells[1].Range.Text.Contains("Identificação da Equipe"))
                    {
                        int rowNumber = row.Index + 2;
                        DataOfAvailableRow.GetNextAvailableRow(new DataOfAvailableRow(Globals.ThisAddIn.Application.ActiveDocument.Tables[1].Rows[rowNumber], rowNumber + 6),
                            "Identificação da Equipe (Continuação)", "OPM Utilizados");
                        break;
                    }
                }
            }
            else if (tipoGuia == TipoGuia.SP_SADT)
            {
                for (int i = 3; i <= Globals.ThisAddIn.Application.ActiveDocument.Tables[3].Rows.Count; i++)
                {
                    if (Globals.ThisAddIn.Application.ActiveDocument.Tables[3].Rows[i].Range.ContentControls.Count == 0)
                    {
                        if (Globals.ThisAddIn.Application.ActiveDocument.Tables[3].Rows[i].Next == null)
                        {
                            object addBeforeRow = Globals.ThisAddIn.Application.ActiveDocument.Tables[3].Rows[i];
                            Globals.ThisAddIn.Application.ActiveDocument.Tables[3].Rows.Add(ref addBeforeRow);
                            Globals.ThisAddIn.Application.ActiveDocument.Tables[3].Rows[i].Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].Visible = false;
                        }
                        infoOfAvailableRow = new DataOfAvailableRow(Globals.ThisAddIn.Application.ActiveDocument.Tables[3].Rows[i], 0, 3, i);
                        break;
                    }
                }
            }

            XDocument xPart = XDocument.Parse(customXMLPart.XML);
            string ns = "http://www.ans.gov.br/padroes/tiss/schemas";

            /*
            var xProcedimentos = xPart.Descendants().Where(t => t.Name.LocalName.Equals("procedimentos"));
            var xEquipe = from nodeProc in xProcedimentos.Descendants(XName.Get("procedimento", namespaceTag))
                          where nodeProc.Element(XName.Get("codigo", namespaceTag)).Value.Equals(listViewProcedimentos.SelectedItems[0].SubItems[1].Text) &&
                                nodeProc.Element(XName.Get("tipoTabela", namespaceTag)).Value.Equals(listViewProcedimentos.SelectedItems[0].SubItems[3].Text)
                          select nodeProc.Parent.Element(XName.Get("equipe", namespaceTag));
            */

            var xEquipe = from nodeProcs in xPart.Descendants(XName.Get("procedimentos", ns))
                          where nodeProcs.Element(XName.Get("procedimento", ns)).Element(XName.Get("codigo", ns)).Value.Equals(listViewProcedimentos.SelectedItems[0].SubItems[1].Text) &&
                                nodeProcs.Element(XName.Get("procedimento", ns)).Element(XName.Get("tipoTabela", ns)).Value.Equals(listViewProcedimentos.SelectedItems[0].SubItems[3].Text)
                          select nodeProcs.Element(XName.Get("equipe", ns));

            foreach (XElement equipe in xEquipe)
            {
                equipe.Add(GetXElement.ct_identificacaoEquipe());
            }

            customXMLPart.NamespaceManager.AddNamespace("ans", "http://www.ans.gov.br/padroes/tiss/schemas");
            CustomXMLNode newNode = customXMLPart.DocumentElement.SelectSingleNode(@"ans:procedimentosRealizados[1]/ans:procedimentos[" + procedimentoSelecionado.ToString() + "]/ans:equipe[1]");
            newNode.ParentNode.ReplaceChildSubtree(xEquipe.ElementAt(0).ToString(), newNode);

            Globals.ThisAddIn.Application.ActiveDocument.Tables[infoOfAvailableRow.NumberOfTable].Rows[infoOfAvailableRow.RowIndex].Cells[1].Range.Text = procedimentoSelecionado.ToString();
            Globals.ThisAddIn.Application.ActiveDocument.Tables[infoOfAvailableRow.NumberOfTable].Rows[infoOfAvailableRow.RowIndex].Cells[1].Range.Select();
            for (int i = 2; i <= Globals.ThisAddIn.Application.ActiveDocument.Tables[infoOfAvailableRow.NumberOfTable].Rows[infoOfAvailableRow.RowIndex].Cells.Count; i++)
            {
                AddinUtils.AddContentControlToRange(Globals.ThisAddIn.Application.ActiveDocument.Tables[infoOfAvailableRow.NumberOfTable].Rows[infoOfAvailableRow.RowIndex].Cells[i].Range,
                    GetNodeXPath.MembroEquipe(i, procedimentoSelecionado, this.Procedimentos), customXMLPart);
            }



            Globals.ThisAddIn.ListaProcedimentosCTP.Visible = false;
            Globals.ThisAddIn.CustomTaskPanes.Remove(Globals.ThisAddIn.ListaProcedimentosCTP);
        }

    }
}
